package logica.robots;

import logica.Nivel;
import logica.Orientacion;
import logica.pisos.Piso;
import logica.premios.Premio;

/**
 * Clase RobotMilitar: modela un robot civil, un robot es capaz de moverse por el nivel recolectando coleccionables y premios hasta 
 * llegar al piso final del nivel. En el transcurso este va usando su combustible y puede reponerlo mediante los packs de 
 * combustibles que se encuentran como premio en el nivel, tambien aunmenta sus puntos mediantes la recoleccion de packs
 * de puntos. 
 * Un robot militar se distingue por tener un tanque de combustible de 70 unidades de combustible y poseer la capacidad 
 * de disparar balas. 
 * Su orientación se codifica según la clase Orientacion. 
 * @author Amorosi, Javier (94528)
 * @author Antiman, Nehuen (102440)
 */
public class RobotMilitar extends Robot {
	
	protected final static int maxCombustible=140; 
	private int balas;
	
	/**
	 * Constructor de la clse RobotMilitar, inicia los atributos de un robot tal cual la clase Robot y además
	 * incializa su combustible en su máxima capacidad para un robot militar, junto con el cargador con 10 balas. 
	 */
	public RobotMilitar() {
		super();
		combustible=maxCombustible;
		balas = 10;
	}

	@Override
	public void recolectarPremio(Premio p) {
		if(p!=null){
			if (combustible + p.getCombustible()< maxCombustible)
				combustible = combustible + p.getCombustible();
			else
				combustible=maxCombustible;
			puntos = puntos + p.getPuntos();
			balas= balas + p.getBalas();
		}
	}	
	
	private boolean disparar(){
		boolean r=(balas>0);
		if (r)
			balas--;
		return r; 
	}
	
	/**
	 * Retorna la cantidad de balas que posee el robot.
	 * @return cantidad de balas que posee el robot.
	 */
	public int getBalas(){
		return balas;
	}

	/**
	 * Este clase de Robot posee la accion especial de disparar balas.
	 * Modela la acción de disparar del robot, esta operación consume una bala.
	 * @param nivel se le proporciona al robot el nivel para que pueda realizar su acción especial.
	 * @param pisoActual se le proporciona al robot el piso donde se encuentra para que pueda realizar su acción especial.	 
	 * @return true si el disparo fue exitoso(tenia balas), false caso contrario. 
	 */
	public boolean accionEspecial(Nivel nivel, Piso pisoActual) {
		boolean r=disparar();
		if (r){
			int o=getOrientacion();
			int i=pisoActual.getFila(); 
			int j=pisoActual.getColumna();
			Piso piso;
			boolean listo=false;
			if (o==Orientacion.ARRIBA)
				while (i>=0 && !listo){
					piso=nivel.getPiso(i, j);
					if (piso.tieneObstaculo()){
						piso.dispararPiso();
						listo=true;
					} else
						i--;
				}
			else if (o==Orientacion.ABAJO)
				while (i<nivel.getFilas() && !listo){
					piso=nivel.getPiso(i, j);
					if (piso.tieneObstaculo()){
						piso.dispararPiso();
						listo=true;
					} else
						i++;
				}
			else if (o==Orientacion.DERECHA)
				while (j<nivel.getColumnas() && !listo){
					piso=nivel.getPiso(i, j);
					if (piso.tieneObstaculo()){
						piso.dispararPiso();
						listo=true;
					} else
						j++;
				}
			else
				while (j>=0 && !listo){
					piso=nivel.getPiso(i, j);
					if (piso.tieneObstaculo()){
						piso.dispararPiso();
						listo=true;
					} else
						j--;
				}
		}
		return r;
	}
	
	@Override
	public String toString(){
		return super.toString()+" | Balas: "+balas;
	}
}
